home *** CD-ROM | disk | FTP | other *** search
/ SGI Freeware 2002 November / SGI Freeware 2002 November - Disc 1.iso / dist / fw_cvs.idb / usr / freeware / info / cvsclient.info-2.z / cvsclient.info-2
Text File  |  2002-01-08  |  40KB  |  850 lines

  1. This is cvsclient.info, produced by makeinfo version 4.0 from
  2. cvsclient.texi.
  3.  
  4. INFO-DIR-SECTION Programming
  5. START-INFO-DIR-ENTRY
  6. * cvsclient: (cvsclient).      The CVS client/server protocol.
  7. END-INFO-DIR-ENTRY
  8.  
  9. 
  10. File: cvsclient.info,  Node: Requests,  Next: Response intro,  Prev: Request intro,  Up: Protocol
  11.  
  12. Requests
  13. ========
  14.  
  15.    Here are the requests:
  16.  
  17. `Root PATHNAME \n'
  18.      Response expected: no.  Tell the server which `CVSROOT' to use.
  19.      Note that PATHNAME is a local directory and _not_ a fully
  20.      qualified `CVSROOT' variable.  PATHNAME must already exist; if
  21.      creating a new root, use the `init' request, not `Root'.  PATHNAME
  22.      does not include the hostname of the server, how to access the
  23.      server, etc.; by the time the CVS protocol is in use, connection,
  24.      authentication, etc., are already taken care of.
  25.  
  26.      The `Root' request must be sent only once, and it must be sent
  27.      before any requests other than `Valid-responses',
  28.      `valid-requests', `UseUnchanged', `Set', `Global_option', `init',
  29.      `noop', or `version'.
  30.  
  31. `Valid-responses REQUEST-LIST \n'
  32.      Response expected: no.  Tell the server what responses the client
  33.      will accept.  request-list is a space separated list of tokens.
  34.      The `Root' request need not have been previously sent.
  35.  
  36. `valid-requests \n'
  37.      Response expected: yes.  Ask the server to send back a
  38.      `Valid-requests' response.  The `Root' request need not have been
  39.      previously sent.
  40.  
  41. `Directory LOCAL-DIRECTORY \n'
  42.      Additional data: REPOSITORY \n.  Response expected: no.  Tell the
  43.      server what directory to use.  The REPOSITORY should be a
  44.      directory name from a previous server response.  Note that this
  45.      both gives a default for `Entry' and `Modified' and also for `ci'
  46.      and the other commands; normal usage is to send `Directory' for
  47.      each directory in which there will be an `Entry' or `Modified',
  48.      and then a final `Directory' for the original directory, then the
  49.      command.  The LOCAL-DIRECTORY is relative to the top level at
  50.      which the command is occurring (i.e. the last `Directory' which is
  51.      sent before the command); to indicate that top level, `.' should
  52.      be sent for LOCAL-DIRECTORY.
  53.  
  54.      Here is an example of where a client gets REPOSITORY and
  55.      LOCAL-DIRECTORY.  Suppose that there is a module defined by
  56.  
  57.           moddir 1dir
  58.  
  59.      That is, one can check out `moddir' and it will take `1dir' in the
  60.      repository and check it out to `moddir' in the working directory.
  61.      Then an initial check out could proceed like this:
  62.  
  63.           C: Root /home/kingdon/zwork/cvsroot
  64.           . . .
  65.           C: Argument moddir
  66.           C: Directory .
  67.           C: /home/kingdon/zwork/cvsroot
  68.           C: co
  69.           S: Clear-sticky moddir/
  70.           S: /home/kingdon/zwork/cvsroot/1dir/
  71.           . . .
  72.           S: ok
  73.  
  74.      In this example the response shown is `Clear-sticky', but it could
  75.      be another response instead.  Note that it returns two pathnames.
  76.      The first one, `moddir/', indicates the working directory to check
  77.      out into.  The second one, ending in `1dir/', indicates the
  78.      directory to pass back to the server in a subsequent `Directory'
  79.      request.  For example, a subsequent `update' request might look
  80.      like:
  81.  
  82.           C: Directory moddir
  83.           C: /home/kingdon/zwork/cvsroot/1dir
  84.           . . .
  85.           C: update
  86.  
  87.      For a given LOCAL-DIRECTORY, the repository will be the same for
  88.      each of the responses, so one can use the repository from whichever
  89.      response is most convenient.  Typically a client will store the
  90.      repository along with the sources for each LOCAL-DIRECTORY, use
  91.      that same setting whenever operating on that LOCAL-DIRECTORY, and
  92.      not update the setting as long as the LOCAL-DIRECTORY exists.
  93.  
  94.      A client is free to rename a LOCAL-DIRECTORY at any time (for
  95.      example, in response to an explicit user request).  While it is
  96.      true that the server supplies a LOCAL-DIRECTORY to the client, as
  97.      noted above, this is only the default place to put the directory.
  98.      Of course, the various `Directory' requests for a single command
  99.      (for example, `update' or `ci' request) should name a particular
  100.      directory with the same LOCAL-DIRECTORY.
  101.  
  102.      Each `Directory' request specifies a brand-new LOCAL-DIRECTORY and
  103.      REPOSITORY; that is, LOCAL-DIRECTORY and REPOSITORY are never
  104.      relative to paths specified in any previous `Directory' request.
  105.  
  106.      Here's a more complex example, in which we request an update of a
  107.      working directory which has been checked out from multiple places
  108.      in the repository.
  109.  
  110.           C: Argument dir1
  111.           C: Directory dir1
  112.           C: /home/foo/repos/mod1
  113.           . . .
  114.           C: Argument dir2
  115.           C: Directory dir2
  116.           C: /home/foo/repos/mod2
  117.           . . .
  118.           C: Argument dir3
  119.           C: Directory dir3/subdir3
  120.           C: /home/foo/repos/mod3
  121.           . . .
  122.           C: update
  123.  
  124.      While directories `dir1' and `dir2' will be handled in similar
  125.      fashion to the other examples given above, `dir3' is slightly
  126.      different from the server's standpoint.  Notice that module `mod3'
  127.      is actually checked out into `dir3/subdir3', meaning that directory
  128.      `dir3' is either empty or does not contain data checked out from
  129.      this repository.
  130.  
  131.      The above example will work correctly in CVS 1.10.1 and later.  The
  132.      server will descend the tree starting from all directories
  133.      mentioned in `Argument' requests and update those directories
  134.      specifically mentioned in `Directory' requests.
  135.  
  136.      Previous versions of CVS (1.10 and earlier) do not behave the same
  137.      way.  While the descent of the tree begins at all directories
  138.      mentioned in `Argument' requests, descent into subdirectories only
  139.      occurs if a directory has been mentioned in a `Directory' request.
  140.      Therefore, the above example would succeed in updating `dir1' and
  141.      `dir2', but would skip `dir3' because that directory was not
  142.      specifically mentioned in a `Directory' request.  A functional
  143.      version of the above that would run on a 1.10 or earlier server is
  144.      as follows:
  145.  
  146.           C: Argument dir1
  147.           C: Directory dir1
  148.           C: /home/foo/repos/mod1
  149.           . . .
  150.           C: Argument dir2
  151.           C: Directory dir2
  152.           C: /home/foo/repos/mod2
  153.           . . .
  154.           C: Argument dir3
  155.           C: Directory dir3
  156.           C: /home/foo/repos/.
  157.           . . .
  158.           C: Directory dir3/subdir3
  159.           C: /home/foo/repos/mod3
  160.           . . .
  161.           C: update
  162.  
  163.      Note the extra `Directory dir3' request.  It might be better to use
  164.      `Emptydir' as the repository for the `dir3' directory, but the
  165.      above will certainly work.
  166.  
  167.      One more peculiarity of the 1.10 and earlier protocol is the
  168.      ordering of `Directory' arguments.  In order for a subdirectory to
  169.      be registered correctly for descent by the recursion processor,
  170.      its parent must be sent first.  For example, the following would
  171.      not work to update `dir3/subdir3':
  172.  
  173.           . . .
  174.           C: Argument dir3
  175.           C: Directory dir3/subdir3
  176.           C: /home/foo/repos/mod3
  177.           . . .
  178.           C: Directory dir3
  179.           C: /home/foo/repos/.
  180.           . . .
  181.           C: update
  182.  
  183.      The implementation of the server in 1.10 and earlier writes the
  184.      administration files for a given directory at the time of the
  185.      `Directory' request.  It also tries to register the directory with
  186.      its parent to mark it for recursion.  In the above example, at the
  187.      time `dir3/subdir3' is created, the physical directory for `dir3'
  188.      will be created on disk, but the administration files will not
  189.      have been created.  Therefore, when the server tries to register
  190.      `dir3/subdir3' for recursion, the operation will silently fail
  191.      because the administration files do not yet exist for `dir3'.
  192.  
  193. `Max-dotdot LEVEL \n'
  194.      Response expected: no.  Tell the server that LEVEL levels of
  195.      directories above the directory which `Directory' requests are
  196.      relative to will be needed.  For example, if the client is
  197.      planning to use a `Directory' request for `../../foo', it must
  198.      send a `Max-dotdot' request with a LEVEL of at least 2.
  199.      `Max-dotdot' must be sent before the first `Directory' request.
  200.  
  201. `Static-directory \n'
  202.      Response expected: no.  Tell the server that the directory most
  203.      recently specified with `Directory' should not have additional
  204.      files checked out unless explicitly requested.  The client sends
  205.      this if the `Entries.Static' flag is set, which is controlled by
  206.      the `Set-static-directory' and `Clear-static-directory' responses.
  207.  
  208. `Sticky TAGSPEC \n'
  209.      Response expected: no.  Tell the server that the directory most
  210.      recently specified with `Directory' has a sticky tag or date
  211.      TAGSPEC.  The first character of TAGSPEC is `T' for a tag, `D' for
  212.      a date, or some other character supplied by a Set-sticky response
  213.      from a previous request to the server.  The remainder of TAGSPEC
  214.      contains the actual tag or date, again as supplied by Set-sticky.
  215.  
  216.      The server should remember `Static-directory' and `Sticky'
  217.      requests for a particular directory; the client need not resend
  218.      them each time it sends a `Directory' request for a given
  219.      directory.  However, the server is not obliged to remember them
  220.      beyond the context of a single command.
  221.  
  222. `Checkin-prog PROGRAM \n'
  223.      Response expected: no.  Tell the server that the directory most
  224.      recently specified with `Directory' has a checkin program PROGRAM.
  225.      Such a program would have been previously set with the
  226.      `Set-checkin-prog' response.
  227.  
  228. `Update-prog PROGRAM \n'
  229.      Response expected: no.  Tell the server that the directory most
  230.      recently specified with `Directory' has an update program PROGRAM.
  231.      Such a program would have been previously set with the
  232.      `Set-update-prog' response.
  233.  
  234. `Entry ENTRY-LINE \n'
  235.      Response expected: no.  Tell the server what version of a file is
  236.      on the local machine.  The name in ENTRY-LINE is a name relative
  237.      to the directory most recently specified with `Directory'.  If the
  238.      user is operating on only some files in a directory, `Entry'
  239.      requests for only those files need be included.  If an `Entry'
  240.      request is sent without `Modified', `Is-modified', or `Unchanged',
  241.      it means the file is lost (does not exist in the working
  242.      directory).  If both `Entry' and one of `Modified', `Is-modified',
  243.      or `Unchanged' are sent for the same file, `Entry' must be sent
  244.      first.  For a given file, one can send `Modified', `Is-modified',
  245.      or `Unchanged', but not more than one of these three.
  246.  
  247. `Kopt OPTION \n'
  248.      This indicates to the server which keyword expansion options to
  249.      use for the file specified by the next `Modified' or `Is-modified'
  250.      request (for example `-kb' for a binary file).  This is similar to
  251.      `Entry', but is used for a file for which there is no entries line.
  252.      Typically this will be a file being added via an `add' or `import'
  253.      request.  The client may not send both `Kopt' and `Entry' for the
  254.      same file.
  255.  
  256. `Checkin-time TIME \n'
  257.      For the file specified by the next `Modified' request, use TIME as
  258.      the time of the checkin.  The TIME is in the format specified by
  259.      RFC822 as modified by RFC1123.  The client may specify any
  260.      timezone it chooses; servers will want to convert that to their own
  261.      timezone as appropriate.  An example of this format is:
  262.  
  263.           26 May 1997 13:01:40 -0400
  264.  
  265.      There is no requirement that the client and server clocks be
  266.      synchronized.  The client just sends its recommendation for a
  267.      timestamp (based on file timestamps or whatever), and the server
  268.      should just believe it (this means that the time might be in the
  269.      future, for example).
  270.  
  271.      Note that this is not a general-purpose way to tell the server
  272.      about the timestamp of a file; that would be a separate request
  273.      (if there are servers which can maintain timestamp and time of
  274.      checkin separately).
  275.  
  276.      This request should affect the `import' request, and may optionally
  277.      affect the `ci' request or other relevant requests if any.
  278.  
  279. `Modified FILENAME \n'
  280.      Response expected: no.  Additional data: mode, \n, file
  281.      transmission.  Send the server a copy of one locally modified
  282.      file.  FILENAME is a file within the most recent directory sent
  283.      with `Directory'; it must not contain `/'.  If the user is
  284.      operating on only some files in a directory, only those files need
  285.      to be included.  This can also be sent without `Entry', if there
  286.      is no entry for the file.
  287.  
  288. `Is-modified FILENAME \n'
  289.      Response expected: no.  Additional data: none.  Like `Modified',
  290.      but used if the server only needs to know whether the file is
  291.      modified, not the contents.
  292.  
  293.      The commands which can take `Is-modified' instead of `Modified'
  294.      with no known change in behavior are: `admin', `diff' (if and only
  295.      if two `-r' or `-D' options are specified), `watch-on',
  296.      `watch-off', `watch-add', `watch-remove', `watchers', `editors',
  297.      `log', and `annotate'.
  298.  
  299.      For the `status' command, one can send `Is-modified' but if the
  300.      client is using imperfect mechanisms such as timestamps to
  301.      determine whether to consider a file modified, then the behavior
  302.      will be different.  That is, if one sends `Modified', then the
  303.      server will actually compare the contents of the file sent and the
  304.      one it derives from to determine whether the file is genuinely
  305.      modified.  But if one sends `Is-modified', then the server takes
  306.      the client's word for it.  A similar situation exists for `tag',
  307.      if the `-c' option is specified.
  308.  
  309.      Commands for which `Modified' is necessary are `co', `ci',
  310.      `update', and `import'.
  311.  
  312.      Commands which do not need to inform the server about a working
  313.      directory, and thus should not be sending either `Modified' or
  314.      `Is-modified': `rdiff', `rtag', `history', `init', and `release'.
  315.  
  316.      Commands for which further investigation is warranted are:
  317.      `remove', `add', and `export'.  Pending such investigation, the
  318.      more conservative course of action is to stick to `Modified'.
  319.  
  320. `Unchanged FILENAME \n'
  321.      Response expected: no.  Tell the server that FILENAME has not been
  322.      modified in the checked out directory.  The FILENAME is a file
  323.      within the most recent directory sent with `Directory'; it must
  324.      not contain `/'.
  325.  
  326. `UseUnchanged \n'
  327.      Response expected: no.  To specify the version of the protocol
  328.      described in this document, servers must support this request
  329.      (although it need not do anything) and clients must issue it.  The
  330.      `Root' request need not have been previously sent.
  331.  
  332. `Notify FILENAME \n'
  333.      Response expected: no.  Tell the server that an `edit' or `unedit'
  334.      command has taken place.  The server needs to send a `Notified'
  335.      response, but such response is deferred until the next time that
  336.      the server is sending responses.  The FILENAME is a file within
  337.      the most recent directory sent with `Directory'; it must not
  338.      contain `/'.  Additional data:
  339.           NOTIFICATION-TYPE \t TIME \t CLIENTHOST \t
  340.           WORKING-DIR \t WATCHES \n
  341.      where NOTIFICATION-TYPE is `E' for edit, `U' for unedit, undefined
  342.      behavior if `C', and all other letters should be silently ignored
  343.      for future expansion.  TIME is the time at which the edit or
  344.      unedit took place, in a user-readable format of the client's
  345.      choice (the server should treat the time as an opaque string
  346.      rather than interpreting it).  CLIENTHOST is the name of the host
  347.      on which the edit or unedit took place, and WORKING-DIR is the
  348.      pathname of the working directory where the edit or unedit took
  349.      place.  WATCHES are the temporary watches, zero or more of the
  350.      following characters in the following order: `E' for edit, `U' for
  351.      unedit, `C' for commit, and all other letters should be silently
  352.      ignored for future expansion.  If NOTIFICATION-TYPE is `E' the
  353.      temporary watches are set; if it is `U' they are cleared.  If
  354.      WATCHES is followed by \t then the \t and the rest of the line
  355.      should be ignored, for future expansion.
  356.  
  357.      The TIME, CLIENTHOST, and WORKING-DIR fields may not contain the
  358.      characters `+', `,', `>', `;', or `='.
  359.  
  360.      Note that a client may be capable of performing an `edit' or
  361.      `unedit' operation without connecting to the server at that time,
  362.      and instead connecting to the server when it is convenient (for
  363.      example, when a laptop is on the net again) to send the `Notify'
  364.      requests.  Even if a client is capable of deferring notifications,
  365.      it should attempt to send them immediately (one can send `Notify'
  366.      requests together with a `noop' request, for example), unless
  367.      perhaps if it can know that a connection would be impossible.
  368.  
  369. `Questionable FILENAME \n'
  370.      Response expected: no.  Additional data: no.  Tell the server to
  371.      check whether FILENAME should be ignored, and if not, next time the
  372.      server sends responses, send (in a `M' response) `?' followed by
  373.      the directory and filename.  FILENAME must not contain `/'; it
  374.      needs to be a file in the directory named by the most recent
  375.      `Directory' request.
  376.  
  377. `Case \n'
  378.      Response expected: no.  Tell the server that filenames should be
  379.      matched in a case-insensitive fashion.  Note that this is not the
  380.      primary mechanism for achieving case-insensitivity; for the most
  381.      part the client keeps track of the case which the server wants to
  382.      use and takes care to always use that case regardless of what the
  383.      user specifies.  For example the filenames given in `Entry' and
  384.      `Modified' requests for the same file must match in case
  385.      regardless of whether the `Case' request is sent.  The latter
  386.      mechanism is more general (it could also be used for 8.3
  387.      filenames, VMS filenames with more than one `.', and any other
  388.      situation in which there is a predictable mapping between
  389.      filenames in the working directory and filenames in the protocol),
  390.      but there are some situations it cannot handle (ignore patterns, or
  391.      situations where the user specifies a filename and the client does
  392.      not know about that file).
  393.  
  394. `Argument TEXT \n'
  395.      Response expected: no.  Save argument for use in a subsequent
  396.      command.  Arguments accumulate until an argument-using command is
  397.      given, at which point they are forgotten.
  398.  
  399. `Argumentx TEXT \n'
  400.      Response expected: no.  Append \n followed by text to the current
  401.      argument being saved.
  402.  
  403. `Global_option OPTION \n'
  404.      Response expected: no.  Transmit one of the global options `-q',
  405.      `-Q', `-l', `-t', `-r', or `-n'.  OPTION must be one of those
  406.      strings, no variations (such as combining of options) are allowed.
  407.      For graceful handling of `valid-requests', it is probably better
  408.      to make new global options separate requests, rather than trying
  409.      to add them to this request.  The `Root' request need not have
  410.      been previously sent.
  411.  
  412. `Gzip-stream LEVEL \n'
  413.      Response expected: no.  Use zlib (RFC 1950/1951) compression to
  414.      compress all further communication between the client and the
  415.      server.  After this request is sent, all further communication
  416.      must be compressed.  All further data received from the server
  417.      will also be compressed.  The LEVEL argument suggests to the
  418.      server the level of compression that it should apply; it should be
  419.      an integer between 1 and 9, inclusive, where a higher number
  420.      indicates more compression.
  421.  
  422. `Kerberos-encrypt \n'
  423.      Response expected: no.  Use Kerberos encryption to encrypt all
  424.      further communication between the client and the server.  This
  425.      will only work if the connection was made over Kerberos in the
  426.      first place.  If both the `Gzip-stream' and the `Kerberos-encrypt'
  427.      requests are used, the `Kerberos-encrypt' request should be used
  428.      first.  This will make the client and server encrypt the
  429.      compressed data, as opposed to compressing the encrypted data.
  430.      Encrypted data is generally incompressible.
  431.  
  432.      Note that this request does not fully prevent an attacker from
  433.      hijacking the connection, in the sense that it does not prevent
  434.      hijacking the connection between the initial authentication and the
  435.      `Kerberos-encrypt' request.
  436.  
  437. `Gssapi-encrypt \n'
  438.      Response expected: no.  Use GSSAPI encryption to encrypt all
  439.      further communication between the client and the server.  This
  440.      will only work if the connection was made over GSSAPI in the first
  441.      place.  See `Kerberos-encrypt', above, for the relation between
  442.      `Gssapi-encrypt' and `Gzip-stream'.
  443.  
  444.      Note that this request does not fully prevent an attacker from
  445.      hijacking the connection, in the sense that it does not prevent
  446.      hijacking the connection between the initial authentication and the
  447.      `Gssapi-encrypt' request.
  448.  
  449. `Gssapi-authenticate \n'
  450.      Response expected: no.  Use GSSAPI authentication to authenticate
  451.      all further communication between the client and the server.  This
  452.      will only work if the connection was made over GSSAPI in the first
  453.      place.  Encrypted data is automatically authenticated, so using
  454.      both `Gssapi-authenticate' and `Gssapi-encrypt' has no effect
  455.      beyond that of `Gssapi-encrypt'.  Unlike encrypted data, it is
  456.      reasonable to compress authenticated data.
  457.  
  458.      Note that this request does not fully prevent an attacker from
  459.      hijacking the connection, in the sense that it does not prevent
  460.      hijacking the connection between the initial authentication and the
  461.      `Gssapi-authenticate' request.
  462.  
  463. `Set VARIABLE=VALUE \n'
  464.      Response expected: no.  Set a user variable VARIABLE to VALUE.
  465.      The `Root' request need not have been previously sent.
  466.  
  467. `expand-modules \n'
  468.      Response expected: yes.  Expand the modules which are specified in
  469.      the arguments.  Returns the data in `Module-expansion' responses.
  470.      Note that the server can assume that this is checkout or export,
  471.      not rtag or rdiff; the latter do not access the working directory
  472.      and thus have no need to expand modules on the client side.
  473.  
  474.      Expand may not be the best word for what this request does.  It
  475.      does not necessarily tell you all the files contained in a module,
  476.      for example.  Basically it is a way of telling you which working
  477.      directories the server needs to know about in order to handle a
  478.      checkout of the specified modules.
  479.  
  480.      For example, suppose that the server has a module defined by
  481.  
  482.           aliasmodule -a 1dir
  483.  
  484.      That is, one can check out `aliasmodule' and it will take `1dir'
  485.      in the repository and check it out to `1dir' in the working
  486.      directory.  Now suppose the client already has this module checked
  487.      out and is planning on using the `co' request to update it.
  488.      Without using `expand-modules', the client would have two bad
  489.      choices: it could either send information about _all_ working
  490.      directories under the current directory, which could be
  491.      unnecessarily slow, or it could be ignorant of the fact that
  492.      `aliasmodule' stands for `1dir', and neglect to send information
  493.      for `1dir', which would lead to incorrect operation.
  494.  
  495.      With `expand-modules', the client would first ask for the module to
  496.      be expanded:
  497.  
  498.           C: Root /home/kingdon/zwork/cvsroot
  499.           . . .
  500.           C: Argument aliasmodule
  501.           C: Directory .
  502.           C: /home/kingdon/zwork/cvsroot
  503.           C: expand-modules
  504.           S: Module-expansion 1dir
  505.           S: ok
  506.  
  507.      and then it knows to check the `1dir' directory and send requests
  508.      such as `Entry' and `Modified' for the files in that directory.
  509.  
  510. `ci \n'
  511. `diff \n'
  512. `tag \n'
  513. `status \n'
  514. `admin \n'
  515. `history \n'
  516. `watchers \n'
  517. `editors \n'
  518. `annotate \n'
  519.      Response expected: yes.  Actually do a cvs command.  This uses any
  520.      previous `Argument', `Directory', `Entry', or `Modified' requests,
  521.      if they have been sent.  The last `Directory' sent specifies the
  522.      working directory at the time of the operation.  No provision is
  523.      made for any input from the user.  This means that `ci' must use a
  524.      `-m' argument if it wants to specify a log message.
  525.  
  526. `log \n'
  527.      Response expected: yes.  Show information for past revisions.
  528.      This uses any previous `Directory', `Entry', or `Modified'
  529.      requests, if they have been sent.  The last `Directory' sent
  530.      specifies the working directory at the time of the operation.
  531.      Also uses previous `Argument''s of which the canonical forms are
  532.      the following (CVS 1.10 and older clients sent what the user
  533.      specified, but clients are encouraged to use the canonical forms
  534.      and other forms are deprecated):
  535.  
  536.     `-b, -h, -l, -N, -R, -t'
  537.           These options go by themselves, one option per `Argument'
  538.           request.
  539.  
  540.     `-d DATE1<DATE2'
  541.           Select revisions between DATE1 and DATE2.  Either date may be
  542.           omitted in which case there is no date limit at that end of
  543.           the range (clients may specify dates such as 1 Jan 1970 or 1
  544.           Jan 2038 for similar purposes but this is problematic as it
  545.           makes assumptions about what dates the server supports).
  546.           Dates are in RFC822/1123 format.  The `-d' is one `Argument'
  547.           request and the date range is a second one.
  548.  
  549.     `-d DATE1<=DATE2'
  550.           Likewise but compare dates for equality.
  551.  
  552.     `-d SINGLEDATE'
  553.           Select the single, latest revision dated SINGLEDATE or
  554.           earlier.
  555.  
  556.           To include several date ranges and/or singledates, repeat the
  557.           `-d' option as many times as necessary.
  558.  
  559.     `-rREV1:REV2'
  560.     `-rBRANCH'
  561.     `-rBRANCH.'
  562.     `-r'
  563.           Specify revisions (note that REV1 or REV2 can be omitted, or
  564.           can refer to branches).  Send both the `-r' and the revision
  565.           information in a single `Argument' request.  To include
  566.           several revision selections, repeat the `-r' option.
  567.  
  568.     `-s STATE'
  569.     `-w'
  570.     `-wLOGIN'
  571.           Select on states or users.  To include more than one state or
  572.           user, repeat the option.  Send the `-s' option as a separate
  573.           argument from the state being selected.  Send the `-w' option
  574.           as part of the same argument as the user being selected.
  575.  
  576. `co \n'
  577.      Response expected: yes.  Get files from the repository.  This uses
  578.      any previous `Argument', `Directory', `Entry', or `Modified'
  579.      requests, if they have been sent.  Arguments to this command are
  580.      module names; the client cannot know what directories they
  581.      correspond to except by (1) just sending the `co' request, and then
  582.      seeing what directory names the server sends back in its
  583.      responses, and (2) the `expand-modules' request.
  584.  
  585. `export \n'
  586.      Response expected: yes.  Get files from the repository.  This uses
  587.      any previous `Argument', `Directory', `Entry', or `Modified'
  588.      requests, if they have been sent.  Arguments to this command are
  589.      module names, as described for the `co' request.  The intention
  590.      behind this command is that a client can get sources from a server
  591.      without storing CVS information about those sources.  That is, a
  592.      client probably should not count on being able to take the entries
  593.      line returned in the `Created' response from an `export' request
  594.      and send it in a future `Entry' request.  Note that the entries
  595.      line in the `Created' response must indicate whether the file is
  596.      binary or text, so the client can create it correctly.
  597.  
  598. `rannotate \n'
  599. `rdiff \n'
  600. `rlog \n'
  601. `rtag \n'
  602.      Response expected: yes.  Actually do a cvs command.  This uses any
  603.      previous `Argument' requests, if they have been sent.  The client
  604.      should not send `Directory', `Entry', or `Modified' requests for
  605.      these commands; they are not used.  Arguments to these commands
  606.      are module names, as described for `co'.
  607.  
  608. `init ROOT-NAME \n'
  609.      Response expected: yes.  If it doesn't already exist, create a CVS
  610.      repository ROOT-NAME.  Note that ROOT-NAME is a local directory
  611.      and _not_ a fully qualified `CVSROOT' variable.  The `Root'
  612.      request need not have been previously sent.
  613.  
  614. `update \n'
  615.      Response expected: yes.  Actually do a `cvs update' command.  This
  616.      uses any previous `Argument', `Directory', `Entry', or `Modified'
  617.      requests, if they have been sent.  The last `Directory' sent
  618.      specifies the working directory at the time of the operation.  The
  619.      `-I' option is not used-files which the client can decide whether
  620.      to ignore are not mentioned and the client sends the
  621.      `Questionable' request for others.
  622.  
  623. `import \n'
  624.      Response expected: yes.  Actually do a `cvs import' command.  This
  625.      uses any previous `Argument', `Directory', `Entry', or `Modified'
  626.      requests, if they have been sent.  The last `Directory' sent
  627.      specifies the working directory at the time of the operation -
  628.      unlike most commands, the repository field of each `Directory'
  629.      request is ignored (it merely must point somewhere within the
  630.      root).  The files to be imported are sent in `Modified' requests
  631.      (files which the client knows should be ignored are not sent; the
  632.      server must still process the CVSROOT/cvsignore file unless -I ! is
  633.      sent).  A log message must have been specified with a `-m'
  634.      argument.
  635.  
  636. `add \n'
  637.      Response expected: yes.  Add a file or directory.  This uses any
  638.      previous `Argument', `Directory', `Entry', or `Modified' requests,
  639.      if they have been sent.  The last `Directory' sent specifies the
  640.      working directory at the time of the operation.
  641.  
  642.      To add a directory, send the directory to be added using
  643.      `Directory' and `Argument' requests.  For example:
  644.  
  645.           C: Root /u/cvsroot
  646.           . . .
  647.           C: Argument nsdir
  648.           C: Directory nsdir
  649.           C: /u/cvsroot/1dir/nsdir
  650.           C: Directory .
  651.           C: /u/cvsroot/1dir
  652.           C: add
  653.           S: M Directory /u/cvsroot/1dir/nsdir added to the repository
  654.           S: ok
  655.  
  656.      You will notice that the server does not signal to the client in
  657.      any particular way that the directory has been successfully added.
  658.      The client is supposed to just assume that the directory has been
  659.      added and update its records accordingly.  Note also that adding a
  660.      directory is immediate; it does not wait until a `ci' request as
  661.      files do.
  662.  
  663.      To add a file, send the file to be added using a `Modified'
  664.      request.  For example:
  665.  
  666.           C: Argument nfile
  667.           C: Directory .
  668.           C: /u/cvsroot/1dir
  669.           C: Modified nfile
  670.           C: u=rw,g=r,o=r
  671.           C: 6
  672.           C: hello
  673.           C: add
  674.           S: E cvs server: scheduling file `nfile' for addition
  675.           S: Mode u=rw,g=r,o=r
  676.           S: Checked-in ./
  677.           S: /u/cvsroot/1dir/nfile
  678.           S: /nfile/0///
  679.           S: E cvs server: use 'cvs commit' to add this file permanently
  680.           S: ok
  681.  
  682.      Note that the file has not been added to the repository; the only
  683.      effect of a successful `add' request, for a file, is to supply the
  684.      client with a new entries line containing `0' to indicate an added
  685.      file.  In fact, the client probably could perform this operation
  686.      without contacting the server, although using `add' does cause the
  687.      server to perform a few more checks.
  688.  
  689.      The client sends a subsequent `ci' to actually add the file to the
  690.      repository.
  691.  
  692.      Another quirk of the `add' request is that with CVS 1.9 and older,
  693.      a pathname specified in an `Argument' request cannot contain `/'.
  694.      There is no good reason for this restriction, and in fact more
  695.      recent CVS servers don't have it.  But the way to interoperate
  696.      with the older servers is to ensure that all `Directory' requests
  697.      for `add' (except those used to add directories, as described
  698.      above), use `.' for LOCAL-DIRECTORY.  Specifying another string for
  699.      LOCAL-DIRECTORY may not get an error, but it will get you strange
  700.      `Checked-in' responses from the buggy servers.
  701.  
  702. `remove \n'
  703.      Response expected: yes.  Remove a file.  This uses any previous
  704.      `Argument', `Directory', `Entry', or `Modified' requests, if they
  705.      have been sent.  The last `Directory' sent specifies the working
  706.      directory at the time of the operation.
  707.  
  708.      Note that this request does not actually do anything to the
  709.      repository; the only effect of a successful `remove' request is to
  710.      supply the client with a new entries line containing `-' to
  711.      indicate a removed file.  In fact, the client probably could
  712.      perform this operation without contacting the server, although
  713.      using `remove' may cause the server to perform a few more checks.
  714.  
  715.      The client sends a subsequent `ci' request to actually record the
  716.      removal in the repository.
  717.  
  718. `watch-on \n'
  719. `watch-off \n'
  720. `watch-add \n'
  721. `watch-remove \n'
  722.      Response expected: yes.  Actually do the `cvs watch on', `cvs
  723.      watch off', `cvs watch add', and `cvs watch remove' commands,
  724.      respectively.  This uses any previous `Argument', `Directory',
  725.      `Entry', or `Modified' requests, if they have been sent.  The last
  726.      `Directory' sent specifies the working directory at the time of
  727.      the operation.
  728.  
  729. `release \n'
  730.      Response expected: yes.  Note that a `cvs release' command has
  731.      taken place and update the history file accordingly.
  732.  
  733. `noop \n'
  734.      Response expected: yes.  This request is a null command in the
  735.      sense that it doesn't do anything, but merely (as with any other
  736.      requests expecting a response) sends back any responses pertaining
  737.      to pending errors, pending `Notified' responses, etc.  The `Root'
  738.      request need not have been previously sent.
  739.  
  740. `update-patches \n'
  741.      Response expected: yes.  This request does not actually do
  742.      anything.  It is used as a signal that the server is able to
  743.      generate patches when given an `update' request.  The client must
  744.      issue the `-u' argument to `update' in order to receive patches.
  745.  
  746. `gzip-file-contents LEVEL \n'
  747.      Response expected: no.  Note that this request does not follow the
  748.      response convention stated above.  `Gzip-stream' is suggested
  749.      instead of `gzip-file-contents' as it gives better compression; the
  750.      only reason to implement the latter is to provide compression with
  751.      CVS 1.8 and earlier.  The `gzip-file-contents' request asks the
  752.      server to compress files it sends to the client using `gzip'
  753.      (RFC1952/1951) compression, using the specified level of
  754.      compression.  If this request is not made, the server must not
  755.      compress files.
  756.  
  757.      This is only a hint to the server.  It may still decide (for
  758.      example, in the case of very small files, or files that already
  759.      appear to be compressed) not to do the compression.  Compression
  760.      is indicated by a `z' preceding the file length.
  761.  
  762.      Availability of this request in the server indicates to the client
  763.      that it may compress files sent to the server, regardless of
  764.      whether the client actually uses this request.
  765.  
  766. `wrapper-sendme-rcsOptions \n'
  767.      Response expected: yes.  Request that the server transmit mappings
  768.      from filenames to keyword expansion modes in `Wrapper-rcsOption'
  769.      responses.
  770.  
  771. `version \n'
  772.      Response expected: yes.  Request that the server transmit its
  773.      version message.  The `Root' request need not have been previously
  774.      sent.
  775.  
  776. `OTHER-REQUEST TEXT \n'
  777.      Response expected: yes.  Any unrecognized request expects a
  778.      response, and does not contain any additional data.  The response
  779.      will normally be something like `error  unrecognized request', but
  780.      it could be a different error if a previous request which doesn't
  781.      expect a response produced an error.
  782.  
  783.    When the client is done, it drops the connection.
  784.  
  785. 
  786. File: cvsclient.info,  Node: Response intro,  Next: Response pathnames,  Prev: Requests,  Up: Protocol
  787.  
  788. Introduction to Responses
  789. =========================
  790.  
  791.    After a command which expects a response, the server sends however
  792. many of the following responses are appropriate.  The server should not
  793. send data at other times (the current implementation may violate this
  794. principle in a few minor places, where the server is printing an error
  795. message and exiting--this should be investigated further).
  796.  
  797.    Any set of responses always ends with `error' or `ok'.  This
  798. indicates that the response is over.
  799.  
  800.    The responses `Checked-in', `New-entry', `Updated', `Created',
  801. `Update-existing', `Merged', and `Patched' are refered to as "file
  802. updating" responses, because they change the status of a file in the
  803. working directory in some way.  The responses `Mode', `Mod-time', and
  804. `Checksum' are referred to as "file update modifying" responses because
  805. they modify the next file updating response.  In no case shall a file
  806. update modifying response apply to a file updating response other than
  807. the next one.  Nor can the same file update modifying response occur
  808. twice for a given file updating response (if servers diagnose this
  809. problem, it may aid in detecting the case where clients send an update
  810. modifying response without following it by a file updating response).
  811.  
  812. 
  813. File: cvsclient.info,  Node: Response pathnames,  Next: Responses,  Prev: Response intro,  Up: Protocol
  814.  
  815. The "pathname" in responses
  816. ===========================
  817.  
  818.    Many of the responses contain something called PATHNAME.  The name
  819. is somewhat misleading; it actually indicates a pair of pathnames.
  820. First, a local directory name relative to the directory in which the
  821. command was given (i.e. the last `Directory' before the command).  Then
  822. a linefeed and a repository name.  Then a slash and the filename
  823. (without a `,v' ending).  For example, for a file `i386.mh' which is in
  824. the local directory `gas.clean/config' and for which the repository is
  825. `/rel/cvsfiles/devo/gas/config':
  826.  
  827.      gas.clean/config/
  828.      /rel/cvsfiles/devo/gas/config/i386.mh
  829.  
  830.    If the server wants to tell the client to create a directory, then it
  831. merely uses the directory in any response, as described above, and the
  832. client should create the directory if it does not exist.  Note that this
  833. should only be done one directory at a time, in order to permit the
  834. client to correctly store the repository for each directory.  Servers
  835. can use requests such as `Clear-sticky', `Clear-static-directory', or
  836. any other requests, to create directories.
  837.  
  838.    Some server implementations may poorly distinguish between a
  839. directory which should not exist and a directory which contains no
  840. files; in order to refrain from creating empty directories a client
  841. should both send the `-P' option to `update' or `co', and should also
  842. detect the case in which the server asks to create a directory but not
  843. any files within it (in that case the client should remove the
  844. directory or refrain from creating it in the first place).  Note that
  845. servers could clean this up greatly by only telling the client to
  846. create directories if the directory in question should exist, but until
  847. servers do this, clients will need to offer the `-P' behavior described
  848. above.
  849.  
  850.